fcntl()
, ioctl()
, এবং select()
হলো সিস্টেম কল এবং ফাংশন, যা নেটওয়ার্ক প্রোগ্রামিং এবং ফাইল/ডিভাইস পরিচালনায় ব্যবহৃত হয়। এগুলোর মাধ্যমে বিভিন্ন ধরনের কনফিগারেশন এবং কন্ট্রোল মেকানিজম পরিচালনা করা যায়, বিশেষ করে Socket বা File Descriptor-এর ক্ষেত্রে। নিচে প্রতিটির ব্যাখ্যা এবং ব্যবহারিক উদাহরণ দেওয়া হলো:
fcntl()
fcntl()
ফাংশনটি একটি File Descriptor-এর বৈশিষ্ট্য নির্ধারণ, পরিবর্তন, বা পড়তে ব্যবহৃত হয়। এটি সাধারণত ফাইল বা Socket-কে Non-Blocking Mode-এ সেট করার জন্য ব্যবহৃত হয় এবং অন্যান্য কন্ট্রোল অপশন নির্ধারণে সহায়ক।
fcntl()
এর সিগনেচার (C ভাষায়)int fcntl(int fd, int cmd, ...);
fd
: File Descriptor (যেমন একটি Socket বা ফাইল)।cmd
: কার্য সম্পন্ন করার জন্য কমান্ড। কিছু সাধারণ কমান্ড হলো:F_GETFL
: File Descriptor-এর বর্তমান ফ্ল্যাগ পড়া।F_SETFL
: File Descriptor-এর ফ্ল্যাগ সেট করা (যেমন Non-Blocking)।#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sockfd;
struct sockaddr_in server_addr;
// Socket তৈরি করা
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// Non-Blocking Mode সেট করা
int flags = fcntl(sockfd, F_GETFL, 0);
if (flags == -1) {
perror("fcntl failed");
close(sockfd);
exit(EXIT_FAILURE);
}
if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) == -1) {
perror("Setting Non-Blocking mode failed");
close(sockfd);
exit(EXIT_FAILURE);
}
// Server address সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// Binding করা
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(sockfd);
exit(EXIT_FAILURE);
}
listen(sockfd, 5);
printf("Server is running in Non-Blocking mode.\n");
close(sockfd);
return 0;
}
ioctl()
ioctl()
হলো একটি Input/Output কন্ট্রোল ফাংশন, যা File Descriptor-এর বিভিন্ন কনফিগারেশন এবং স্টেট পড়তে বা পরিবর্তন করতে ব্যবহৃত হয়। এটি বিশেষ করে ডিভাইস কন্ট্রোল এবং নেটওয়ার্ক ইন্টারফেস কনফিগারেশনের জন্য ব্যবহৃত হয়।
ioctl()
এর সিগনেচার (C ভাষায়)int ioctl(int fd, unsigned long request, ...);
fd
: File Descriptor।request
: কার্য সম্পন্ন করার জন্য রিকোয়েস্ট (যেমন, ফাইল বা ডিভাইসের স্টেট চেক করা বা পরিবর্তন করা)।#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sockfd;
int buffer_size;
struct sockaddr_in server_addr;
// Socket তৈরি করা
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// Server address সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// Binding করা
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(sockfd);
exit(EXIT_FAILURE);
}
// Listening শুরু করা
listen(sockfd, 5);
// Socket buffer size চেক করা
if (ioctl(sockfd, FIONREAD, &buffer_size) == -1) {
perror("ioctl failed");
close(sockfd);
exit(EXIT_FAILURE);
}
printf("Bytes available in socket buffer: %d\n", buffer_size);
close(sockfd);
return 0;
}
select()
select()
হলো একটি I/O Multiplexing ফাংশন, যা একাধিক File Descriptor (যেমন, Socket) একসাথে পর্যবেক্ষণ করতে ব্যবহৃত হয়। এটি দেখে যে কোনো File Descriptor একটি I/O অপারেশন করার জন্য প্রস্তুত কিনা এবং তখন সেই Descriptor-এর জন্য উপযুক্ত পদক্ষেপ নেওয়া যায়।
select()
এর সিগনেচার (C ভাষায়)int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
nfds
: সর্বোচ্চ File Descriptor এর মান + 1।readfds
: File Descriptor সেট যা Read অপারেশনের জন্য পর্যবেক্ষণ করা হবে।writefds
: File Descriptor সেট যা Write অপারেশনের জন্য পর্যবেক্ষণ করা হবে।exceptfds
: File Descriptor সেট যা Exceptional Condition-এর জন্য পর্যবেক্ষণ করা হবে।timeout
: কত সময় অপেক্ষা করবে (একটি টাইমআউট ভ্যালু)।select()
এর উদাহরণ#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/select.h>
#define PORT 8080
int main() {
int server_fd, client_fd, max_fd, activity;
struct sockaddr_in server_addr;
fd_set read_fds;
char buffer[1024];
socklen_t addrlen;
// Server socket তৈরি করা
server_fd = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
listen(server_fd, 5);
printf("Server is running using select() for I/O Multiplexing.\n");
while (1) {
// File Descriptor সেট আপডেট করা
FD_ZERO(&read_fds);
FD_SET(server_fd, &read_fds);
max_fd = server_fd;
// select() কল করা
activity = select(max_fd + 1, &read_fds, NULL, NULL, NULL);
if (activity > 0 && FD_ISSET(server_fd, &read_fds)) {
client_fd = accept(server_fd, NULL, NULL);
printf("New client connected!\n");
read(client_fd, buffer, sizeof(buffer));
printf("Client says: %s\n", buffer);
close(client_fd);
}
}
close(server_fd);
return 0;
}
common.read_more